//
// Created by ROG on 2024/10/8.
//
#include <stdio.h>
#include <stdbool.h>

#define MAXSIZE 100  // 定义线性表的最大长度

typedef struct {
    int data[MAXSIZE];  // 存储线性表的元素
    int length;         // 线性表的当前长度
} SeqList;

// 初始化线性表
void InitList(SeqList *L) {
    L->length = 0;  // 初始时，线性表长度为0
}

// 判断线性表是否为空
bool IsEmpty(SeqList L) {
    return L.length == 0;
}

// 判断线性表是否已满
bool IsFull(SeqList L) {
    return L.length == MAXSIZE;
}

// 插入元素到线性表的指定位置
bool Insert(SeqList *L, int pos, int elem) {
    if (IsFull(*L)) {
        printf("线性表已满，无法插入元素。\n");
        return false;
    }
    if (pos < 1 || pos > L->length + 1) {
        printf("插入位置不合法。\n");
        return false;
    }

    // 将插入位置后的元素依次后移
    for (int i = L->length; i >= pos; i--) {
        L->data[i] = L->data[i - 1];
    }

    // 插入元素
    L->data[pos - 1] = elem;
    L->length++;
    return true;
}

// 删除指定位置的元素
bool Delete(SeqList *L, int pos) {
    if (IsEmpty(*L)) {
        printf("线性表为空，无法删除元素。\n");
        return false;
    }
    if (pos < 1 || pos > L->length) {
        printf("删除位置不合法。\n");
        return false;
    }

    // 将删除位置后的元素依次前移
    for (int i = pos; i < L->length; i++) {
        L->data[i - 1] = L->data[i];
    }

    L->length--;
    return true;
}

// 查找元素并返回其下标
int Search(SeqList L, int elem) {
    for (int i = 0; i < L.length; i++) {
        if (L.data[i] == elem) {
            return i + 1;  // 返回元素在数组中的位置
        }
    }
    return -1;  // 未找到返回-1
}

// 显示线性表中的元素
void DisplayList(SeqList L) {
    if (IsEmpty(L)) {
        printf("线性表为空。\n");
        return;
    }

    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");
}

int main() {
    SeqList L;
    InitList(&L);

    // 插入元素
    Insert(&L, 1, 10);
    Insert(&L, 2, 20);
    Insert(&L, 3, 30);
    printf("线性表元素为: ");
    DisplayList(L);

    // 查找元素
    int pos = Search(L, 20);
    if (pos != -1) {
        printf("元素20的位置为: %d\n", pos);
    } else {
        printf("未找到元素20。\n");
    }

    // 删除元素
    Delete(&L, 2);
    printf("删除元素后的线性表为: ");
    DisplayList(L);

    return 0;
}
